class Solution {
    public double myPow(double x, int n) {
        long N = n;

        if(N < 0) {
            N = -N;
            x = 1/x;
        }

        /*double answer = 1;
        for(int i=1; i<=N; i++) {
            answer *= x;
        }

        return answer;*/

        return fastPower(x, N);
        
    }


    private double fastPower(double x, long N) {
        // Time complexity: O(log2(N)), space complexity: O(log2(N))
        /*if(N == 0) return 1;

        double half = fastPower(x, N / 2);

        double answer;
        if(N % 2 == 0) {
            answer = half * half;
        } else {
            answer = half * half * x;
        }

        return answer;*/

        double answer = 1;
        double base = x;

        for(long i = N; i > 0; i /= 2) {
            if(i % 2 == 1) {
                answer *= base;
            }
            base *= base;
        }

        return answer;
    }
}